#include"stdafx.h"
#include "io.h"

IO::IO( )
{
	this->CPUMem = CPUMem;
	VRAMAddr = 0;
	NMINotify = FALSE;
}

IO::~IO()
{
}


/*$2000*/
WORD IO::GetNameTableAddr()
{
	BOOL b0,b1;
	b0 = GET_BIT( CR1, 0 );
	b1 = GET_BIT( CR1, 1 );
	BYTE offset = b1*2 + b0*1;
	return 0x2000 + offset * 0x400;
}

BYTE IO::GetIncAmount()
{
	return GET_BIT( CR1,2) == 0 ? 1 : 32;
}

WORD IO::GetSprPtnAddr()
{	
	return GET_BIT( CR1,3) * 0x1000;
}


WORD IO::GetBkPtnAddr()
{
	return GET_BIT( CR1,4) * 0x1000;
}

BYTE IO::GetSprSz()
{
	return GET_BIT( CR1,5);
}

BOOL IO::NMI()
{
	return GET_BIT( CR1,7);
}

/*! $2000*/

/*$2001*/

BOOL IO::IsMonochrome()
{
	return GET_BIT( CR2,0);
}

BOOL IO::ClipBk()
{
	return GET_BIT( CR2,1);
}

BOOL IO::ClipSpr()
{
	return GET_BIT( CR2,2);
}

BOOL IO::ShowBk()
{
	return GET_BIT( CR2,3);
}

BOOL IO::ShowSpr()
{
	return GET_BIT( CR2,4);
}

/*$2003 $2004*/
BYTE IO::GetSprAddr()
{
	return SPRADDRREG;
}
void IO::SetSprAddr( BYTE val )
{
	SPRADDRREG = val;
}


void IO::ResetFromReading2002()
{
	SET_BIT( STAT,7,0);
	SCROLLREG = 0;
	VRAMADDRREG = 0;
}
WORD IO::GetVRAMAddr()
{
	return this->VRAMAddr;
}

void IO::SetVRAMAddr( WORD data )
{
	this->VRAMAddr = data;
}


void IO::AddrToCPUMem( PBYTE cpumem )
{
	this->CPUMem = cpumem;
}

void IO::ResetCR2()
{
	SET_BIT( STAT, 5, 0 );
	SET_BIT( STAT, 6, 0 );
	SET_BIT( STAT, 7, 0 );
}

void IO::SetHitFlag()
{
	SET_BIT( STAT, 6, 1 );
}

BOOL IO::IgnoreWriteToVRAM()
{
	return GET_BIT( STAT, 4 );
}

void IO::SetVBlankFlag()
{
	SET_BIT( STAT, 7, 1);
	NMINotify = TRUE;
}

void IO::ClearHitFlag()
{
	SET_BIT( STAT, 6, 0 );
}

void IO::SetOver8Sprs()
{
	SET_BIT( STAT, 5, 1 );
}

void IO::ClearOver8Sprs()
{
	SET_BIT( STAT, 5, 0 );
}
